/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.lucene.analysis.lius.unicode;


import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Token;

/**
 * <p>Titre : UTF8AccentRemoverFilter  </p>
 * <p>Description : Class used by Lius framework (http://sourceforge.net/projects/lius/)</p>
 * <p>Société : Universite Laval library</p>
 * @author Rida Benjelloun (rida.benjelloun@gmail.com)
 * @version 1.0
 */

public class UTF8AccentRemoverFilter extends TokenFilter {
    public UTF8AccentRemoverFilter(TokenStream input) {
        super(input);
    }


    public final Token next() throws java.io.IOException {
        final Token t = input.next();
        if (t == null)
            return null;
        return new Token(removeAccents(t.termText()), t.startOffset(), t.endOffset(), t.type());
    }

    public final static String removeAccents(String input) {
        final StringBuffer output = new StringBuffer();
        for (int i = 0; i < input.length(); i++) {
            switch (input.charAt(i)) {
                case '\u0400':

                    output.append('\u0065');

                    break;

                case '\u0401':

                    output.append('\u0065');

                    break;

                case '\u0407':

                    output.append('\u0069');

                    break;

                case '\u0450':

                    output.append('\u0065');

                    break;

                case '\u0451':

                    output.append('\u0065');

                    break;

                case '\u0457':

                    output.append('\u0069');

                    break;

                case '\u04D0':

                    output.append('\u0061');

                    break;

                case '\u04D1':

                    output.append('\u0061');

                    break;

                case '\u04D2':

                    output.append('\u0061');

                    break;

                case '\u04D3':

                    output.append('\u0061');

                    break;

                case '\u04D6':

                    output.append('\u0065');

                    break;

                case '\u04D7':

                    output.append('\u0065');

                    break;

                case '\u04E6':

                    output.append('\u006F');

                    break;

                case '\u04E7':

                    output.append('\u006F');

                    break;

                case '\u04EE':

                    output.append('\u0079');

                    break;

                case '\u04EF':

                    output.append('\u0079');

                    break;

                case '\u04F0':

                    output.append('\u0079');

                    break;

                case '\u04F1':

                    output.append('\u0079');

                    break;

                case '\u04F2':

                    output.append('\u0079');

                    break;

                case '\u04F3':

                    output.append('\u0079');

                    break;

                case '\u0386':

                    output.append('\u0061');

                    break;

                case '\u0388':

                    output.append('\u0065');

                    break;

                case '\u0389':

                    output.append('\u0068');

                    break;

                case '\u038A':

                    output.append('\u0069');

                    break;

                case '\u038C':

                    output.append('\u006F');

                    break;

                case '\u038E':

                    output.append('\u0079');

                    break;

                case '\u0390':

                    output.append('\u0069');

                    break;

                case '\u03AA':

                    output.append('\u0069');

                    break;

                case '\u03AB':

                    output.append('\u0079');

                    break;

                case '\u03AF':

                    output.append('\u0069');

                    break;

                case '\u03CA':

                    output.append('\u0069');

                    break;

                case '\u03CC':

                    output.append('\u006F');

                    break;

                case '\u1F08':

                    output.append('\u0061');

                    break;

                case '\u1F09':

                    output.append('\u0061');

                    break;

                case '\u1F0A':

                    output.append('\u0061');

                    break;

                case '\u1F0B':

                    output.append('\u0061');

                    break;

                case '\u1F0C':

                    output.append('\u0061');

                    break;

                case '\u1F0D':

                    output.append('\u0061');

                    break;

                case '\u1F0E':

                    output.append('\u0061');

                    break;

                case '\u1F0F':

                    output.append('\u0061');

                    break;

                case '\u1F18':

                    output.append('\u0065');

                    break;

                case '\u1F19':

                    output.append('\u0065');

                    break;

                case '\u1F1A':

                    output.append('\u0065');

                    break;

                case '\u1F1B':

                    output.append('\u0065');

                    break;

                case '\u1F1C':

                    output.append('\u0065');

                    break;

                case '\u1F1D':

                    output.append('\u0065');

                    break;

                case '\u1F28':

                    output.append('\u0068');

                    break;

                case '\u1F29':

                    output.append('\u0068');

                    break;

                case '\u1F2A':

                    output.append('\u0068');

                    break;

                case '\u1F2B':

                    output.append('\u0068');

                    break;

                case '\u1F2C':

                    output.append('\u0068');

                    break;

                case '\u1F2D':

                    output.append('\u0068');

                    break;

                case '\u1F2E':

                    output.append('\u0068');

                    break;

                case '\u1F2F':

                    output.append('\u0068');

                    break;

                case '\u1F30':

                    output.append('\u0069');

                    break;

                case '\u1F31':

                    output.append('\u0069');

                    break;

                case '\u1F32':

                    output.append('\u0069');

                    break;

                case '\u1F33':

                    output.append('\u0069');

                    break;

                case '\u1F34':

                    output.append('\u0069');

                    break;

                case '\u1F35':

                    output.append('\u0069');

                    break;

                case '\u1F36':

                    output.append('\u0069');

                    break;

                case '\u1F37':

                    output.append('\u0069');

                    break;

                case '\u1F38':

                    output.append('\u0069');

                    break;

                case '\u1F39':

                    output.append('\u0069');

                    break;

                case '\u1F3A':

                    output.append('\u0069');

                    break;

                case '\u1F3B':

                    output.append('\u0069');

                    break;

                case '\u1F3C':

                    output.append('\u0069');

                    break;

                case '\u1F3D':

                    output.append('\u0069');

                    break;

                case '\u1F3E':

                    output.append('\u0069');

                    break;

                case '\u1F3F':

                    output.append('\u0069');

                    break;

                case '\u1F40':

                    output.append('\u006F');

                    break;

                case '\u1F41':

                    output.append('\u006F');

                    break;

                case '\u1F42':

                    output.append('\u006F');

                    break;

                case '\u1F43':

                    output.append('\u006F');

                    break;

                case '\u1F44':

                    output.append('\u006F');

                    break;

                case '\u1F45':

                    output.append('\u006F');

                    break;

                case '\u1F48':

                    output.append('\u006F');

                    break;

                case '\u1F49':

                    output.append('\u006F');

                    break;

                case '\u1F4A':

                    output.append('\u006F');

                    break;

                case '\u1F4B':

                    output.append('\u006F');

                    break;

                case '\u1F4C':

                    output.append('\u006F');

                    break;

                case '\u1F4D':

                    output.append('\u006F');

                    break;

                case '\u1F59':

                    output.append('\u0079');

                    break;

                case '\u1F5B':

                    output.append('\u0079');

                    break;

                case '\u1F5D':

                    output.append('\u0079');

                    break;

                case '\u1F5F':

                    output.append('\u0079');

                    break;

                case '\u1F76':

                    output.append('\u0069');

                    break;

                case '\u1F77':

                    output.append('\u0069');

                    break;

                case '\u1F78':

                    output.append('\u006F');

                    break;

                case '\u1F79':

                    output.append('\u006F');

                    break;

                case '\u1F88':

                    output.append('\u0061');

                    break;

                case '\u1F89':

                    output.append('\u0061');

                    break;

                case '\u1F8A':

                    output.append('\u0061');

                    break;

                case '\u1F8B':

                    output.append('\u0061');

                    break;

                case '\u1F8C':

                    output.append('\u0061');

                    break;

                case '\u1F8D':

                    output.append('\u0061');

                    break;

                case '\u1F8E':

                    output.append('\u0061');

                    break;

                case '\u1F8F':

                    output.append('\u0061');

                    break;

                case '\u1F98':

                    output.append('\u0068');

                    break;

                case '\u1F99':

                    output.append('\u0068');

                    break;

                case '\u1F9A':

                    output.append('\u0068');

                    break;

                case '\u1F9B':

                    output.append('\u0068');

                    break;

                case '\u1F9C':

                    output.append('\u0068');

                    break;

                case '\u1F9D':

                    output.append('\u0068');

                    break;

                case '\u1F9E':

                    output.append('\u0068');

                    break;

                case '\u1F9F':

                    output.append('\u0068');

                    break;

                case '\u1FB8':

                    output.append('\u0061');

                    break;

                case '\u1FB9':

                    output.append('\u0061');

                    break;

                case '\u1FBA':

                    output.append('\u0061');

                    break;

                case '\u1FBB':

                    output.append('\u0061');

                    break;

                case '\u1FBC':

                    output.append('\u0061');

                    break;

                case '\u1FC8':

                    output.append('\u0065');

                    break;

                case '\u1FC9':

                    output.append('\u0065');

                    break;

                case '\u1FCA':

                    output.append('\u0068');

                    break;

                case '\u1FCB':

                    output.append('\u0068');

                    break;

                case '\u1FCC':

                    output.append('\u0068');

                    break;

                case '\u1FD0':

                    output.append('\u0069');

                    break;

                case '\u1FD1':

                    output.append('\u0069');

                    break;

                case '\u1FD2':

                    output.append('\u0069');

                    break;

                case '\u1FD3':

                    output.append('\u0069');

                    break;

                case '\u1FD6':

                    output.append('\u0069');

                    break;

                case '\u1FD7':

                    output.append('\u0069');

                    break;

                case '\u1FD8':

                    output.append('\u0069');

                    break;

                case '\u1FD9':

                    output.append('\u0069');

                    break;

                case '\u1FDA':

                    output.append('\u0069');

                    break;

                case '\u1FDB':

                    output.append('\u0069');

                    break;

                case '\u1FE8':

                    output.append('\u0079');

                    break;

                case '\u1FE9':

                    output.append('\u0079');

                    break;

                case '\u1FEA':

                    output.append('\u0079');

                    break;

                case '\u1FEB':

                    output.append('\u0079');

                    break;

                case '\u1FEC':

                    output.append('\u0070');

                    break;

                case '\u1FF8':

                    output.append('\u006F');

                    break;

                case '\u1FF9':

                    output.append('\u006F');

                    break;

                case '\u00C0':

                    output.append('\u0061');

                    break;

                case '\u00C1':

                    output.append('\u0061');

                    break;

                case '\u00C2':

                    output.append('\u0061');

                    break;

                case '\u00C3':

                    output.append('\u0061');

                    break;

                case '\u00C4':

                    output.append('\u0061');

                    break;

                case '\u00C5':

                    output.append('\u0061');

                    break;

                case '\u00C7':

                    output.append('\u0063');

                    break;

                case '\u00C8':

                    output.append('\u0065');

                    break;

                case '\u00C9':

                    output.append('\u0065');

                    break;

                case '\u00CA':

                    output.append('\u0065');

                    break;

                case '\u00CB':

                    output.append('\u0065');

                    break;

                case '\u00CC':

                    output.append('\u0069');

                    break;

                case '\u00CD':

                    output.append('\u0069');

                    break;

                case '\u00CE':

                    output.append('\u0069');

                    break;

                case '\u00CF':

                    output.append('\u0069');

                    break;

                case '\u00D0':

                    output.append('\u0064');

                    break;

                case '\u00D1':

                    output.append('\u006E');

                    break;

                case '\u00D2':

                    output.append('\u006F');

                    break;

                case '\u00D3':

                    output.append('\u006F');

                    break;

                case '\u00D4':

                    output.append('\u006F');

                    break;

                case '\u00D5':

                    output.append('\u006F');

                    break;

                case '\u00D6':

                    output.append('\u006F');

                    break;

                case '\u00D8':

                    output.append('\u006F');

                    break;

                case '\u00D9':

                    output.append('\u0075');

                    break;

                case '\u00DA':

                    output.append('\u0075');

                    break;

                case '\u00DB':

                    output.append('\u0075');

                    break;

                case '\u00DC':

                    output.append('\u0075');

                    break;

                case '\u00DD':

                    output.append('\u0079');

                    break;

                case '\u00E0':

                    output.append('\u0061');

                    break;

                case '\u00E1':

                    output.append('\u0061');

                    break;

                case '\u00E2':

                    output.append('\u0061');

                    break;

                case '\u00E3':

                    output.append('\u0061');

                    break;

                case '\u00E4':

                    output.append('\u0061');

                    break;

                case '\u00E5':

                    output.append('\u0061');

                    break;

                case '\u00E7':

                    output.append('\u0063');

                    break;

                case '\u00E8':

                    output.append('\u0065');

                    break;

                case '\u00E9':

                    output.append('\u0065');

                    break;

                case '\u00EA':

                    output.append('\u0065');

                    break;

                case '\u00EB':

                    output.append('\u0065');

                    break;

                case '\u00EC':

                    output.append('\u0069');

                    break;

                case '\u00ED':

                    output.append('\u0069');

                    break;

                case '\u00EE':

                    output.append('\u0069');

                    break;

                case '\u00EF':

                    output.append('\u0069');

                    break;

                case '\u00F1':

                    output.append('\u006E');

                    break;

                case '\u00F2':

                    output.append('\u006F');

                    break;

                case '\u00F3':

                    output.append('\u006F');

                    break;

                case '\u00F4':

                    output.append('\u006F');

                    break;

                case '\u00F5':

                    output.append('\u006F');

                    break;

                case '\u00F6':

                    output.append('\u006F');

                    break;

                case '\u00F8':

                    output.append('\u006F');

                    break;

                case '\u00F9':

                    output.append('\u0075');

                    break;

                case '\u00FA':

                    output.append('\u0075');

                    break;

                case '\u00FB':

                    output.append('\u0075');

                    break;

                case '\u00FC':

                    output.append('\u0075');

                    break;

                case '\u00FD':

                    output.append('\u0079');

                    break;

                case '\u00FF':

                    output.append('\u0079');

                    break;

                case '\u0100':

                    output.append('\u0061');

                    break;

                case '\u0101':

                    output.append('\u0061');

                    break;

                case '\u0102':

                    output.append('\u0061');

                    break;

                case '\u0103':

                    output.append('\u0061');

                    break;

                case '\u0104':

                    output.append('\u0061');

                    break;

                case '\u0105':

                    output.append('\u0061');

                    break;

                case '\u0106':

                    output.append('\u0063');

                    break;

                case '\u0107':

                    output.append('\u0063');

                    break;

                case '\u0108':

                    output.append('\u0063');

                    break;

                case '\u0109':

                    output.append('\u0063');

                    break;

                case '\u010A':

                    output.append('\u0063');

                    break;

                case '\u010B':

                    output.append('\u0063');

                    break;

                case '\u010C':

                    output.append('\u0063');

                    break;

                case '\u010D':

                    output.append('\u0063');

                    break;

                case '\u010E':

                    output.append('\u0064');

                    break;

                case '\u010F':

                    output.append('\u0064');

                    break;

                case '\u0110':

                    output.append('\u0064');

                    break;

                case '\u0111':

                    output.append('\u0064');

                    break;

                case '\u0112':

                    output.append('\u0065');

                    break;

                case '\u0113':

                    output.append('\u0065');

                    break;

                case '\u0114':

                    output.append('\u0065');

                    break;

                case '\u0115':

                    output.append('\u0065');

                    break;

                case '\u0116':

                    output.append('\u0065');

                    break;

                case '\u0117':

                    output.append('\u0065');

                    break;

                case '\u0118':

                    output.append('\u0065');

                    break;

                case '\u0119':

                    output.append('\u0065');

                    break;

                case '\u011A':

                    output.append('\u0065');

                    break;

                case '\u011B':

                    output.append('\u0065');

                    break;

                case '\u011C':

                    output.append('\u0067');

                    break;

                case '\u011D':

                    output.append('\u0067');

                    break;

                case '\u011E':

                    output.append('\u0067');

                    break;

                case '\u011F':

                    output.append('\u0067');

                    break;

                case '\u0120':

                    output.append('\u0067');

                    break;

                case '\u0121':

                    output.append('\u0067');

                    break;

                case '\u0122':

                    output.append('\u0067');

                    break;

                case '\u0123':

                    output.append('\u0067');

                    break;

                case '\u0124':

                    output.append('\u0068');

                    break;

                case '\u0125':

                    output.append('\u0068');

                    break;

                case '\u0126':

                    output.append('\u0068');

                    break;

                case '\u0127':

                    output.append('\u0068');

                    break;

                case '\u0128':

                    output.append('\u0069');

                    break;

                case '\u0129':

                    output.append('\u0069');

                    break;

                case '\u012A':

                    output.append('\u0069');

                    break;

                case '\u012B':

                    output.append('\u0069');

                    break;

                case '\u012C':

                    output.append('\u0069');

                    break;

                case '\u012D':

                    output.append('\u0069');

                    break;

                case '\u012E':

                    output.append('\u0069');

                    break;

                case '\u012F':

                    output.append('\u0069');

                    break;

                case '\u0130':

                    output.append('\u0069');

                    break;

                case '\u0131':

                    output.append('\u0069');

                    break;

                case '\u0134':

                    output.append('\u006A');

                    break;

                case '\u0135':

                    output.append('\u006A');

                    break;

                case '\u0136':

                    output.append('\u006B');

                    break;

                case '\u0137':

                    output.append('\u006B');

                    break;

                case '\u0138':

                    output.append('\u006B');

                    break;

                case '\u0139':

                    output.append('\u006C');

                    break;

                case '\u013A':

                    output.append('\u006C');

                    break;

                case '\u013B':

                    output.append('\u006C');

                    break;

                case '\u013C':

                    output.append('\u006C');

                    break;

                case '\u013D':

                    output.append('\u006C');

                    break;

                case '\u013E':

                    output.append('\u006C');

                    break;

                case '\u013F':

                    output.append('\u006C');

                    break;

                case '\u0140':

                    output.append('\u006C');

                    break;

                case '\u0141':

                    output.append('\u006C');

                    break;

                case '\u0142':

                    output.append('\u006C');

                    break;

                case '\u0143':

                    output.append('\u006E');

                    break;

                case '\u0144':

                    output.append('\u006E');

                    break;

                case '\u0145':

                    output.append('\u006E');

                    break;

                case '\u0146':

                    output.append('\u006E');

                    break;

                case '\u0147':

                    output.append('\u006E');

                    break;

                case '\u0148':

                    output.append('\u006E');

                    break;

                case '\u0149':

                    output.append('\u006E');

                    break;

                case '\u014A':

                    output.append('\u006E');

                    break;

                case '\u014B':

                    output.append('\u006E');

                    break;

                case '\u014C':

                    output.append('\u006F');

                    break;

                case '\u014D':

                    output.append('\u006F');

                    break;

                case '\u014E':

                    output.append('\u006F');

                    break;

                case '\u014F':

                    output.append('\u006F');

                    break;

                case '\u0150':

                    output.append('\u006F');

                    break;

                case '\u0151':

                    output.append('\u006F');

                    break;

                case '\u0154':

                    output.append('\u0072');

                    break;

                case '\u0155':

                    output.append('\u0072');

                    break;

                case '\u0156':

                    output.append('\u0072');

                    break;

                case '\u0157':

                    output.append('\u0072');

                    break;

                case '\u0158':

                    output.append('\u0072');

                    break;

                case '\u0159':

                    output.append('\u0072');

                    break;

                case '\u015A':

                    output.append('\u0073');

                    break;

                case '\u015B':

                    output.append('\u0073');

                    break;

                case '\u015C':

                    output.append('\u0073');

                    break;

                case '\u015D':

                    output.append('\u0073');

                    break;

                case '\u015E':

                    output.append('\u0073');

                    break;

                case '\u015F':

                    output.append('\u0073');

                    break;

                case '\u0160':

                    output.append('\u0073');

                    break;

                case '\u0161':

                    output.append('\u0073');

                    break;

                case '\u0162':

                    output.append('\u0074');

                    break;

                case '\u0163':

                    output.append('\u0074');

                    break;

                case '\u0164':

                    output.append('\u0074');

                    break;

                case '\u0165':

                    output.append('\u0074');

                    break;

                case '\u0166':

                    output.append('\u0074');

                    break;

                case '\u0167':

                    output.append('\u0074');

                    break;

                case '\u0168':

                    output.append('\u0075');

                    break;

                case '\u0169':

                    output.append('\u0075');

                    break;

                case '\u016A':

                    output.append('\u0075');

                    break;

                case '\u016B':

                    output.append('\u0075');

                    break;

                case '\u016C':

                    output.append('\u0075');

                    break;

                case '\u016D':

                    output.append('\u0075');

                    break;

                case '\u016E':

                    output.append('\u0075');

                    break;

                case '\u016F':

                    output.append('\u0075');

                    break;

                case '\u0170':

                    output.append('\u0075');

                    break;

                case '\u0171':

                    output.append('\u0075');

                    break;

                case '\u0172':

                    output.append('\u0075');

                    break;

                case '\u0173':

                    output.append('\u0075');

                    break;

                case '\u0174':

                    output.append('\u0077');

                    break;

                case '\u0175':

                    output.append('\u0077');

                    break;

                case '\u0176':

                    output.append('\u0079');

                    break;

                case '\u0177':

                    output.append('\u0079');

                    break;

                case '\u0178':

                    output.append('\u0079');

                    break;

                case '\u0179':

                    output.append('\u007A');

                    break;

                case '\u017A':

                    output.append('\u007A');

                    break;

                case '\u017B':

                    output.append('\u007A');

                    break;

                case '\u017C':

                    output.append('\u007A');

                    break;

                case '\u017D':

                    output.append('\u007A');

                    break;

                case '\u017E':

                    output.append('\u007A');

                    break;

                case '\u0180':

                    output.append('\u0062');

                    break;

                case '\u0181':

                    output.append('\u0062');

                    break;

                case '\u0182':

                    output.append('\u0062');

                    break;

                case '\u0183':

                    output.append('\u0062');

                    break;

                case '\u0184':

                    output.append('\u0062');

                    break;

                case '\u0185':

                    output.append('\u0062');

                    break;

                case '\u0187':

                    output.append('\u0063');

                    break;

                case '\u0188':

                    output.append('\u0063');

                    break;

                case '\u0189':

                    output.append('\u0064');

                    break;

                case '\u018A':

                    output.append('\u0064');

                    break;

                case '\u018B':

                    output.append('\u0064');

                    break;

                case '\u018C':

                    output.append('\u0064');

                    break;

                case '\u0191':

                    output.append('\u0066');

                    break;

                case '\u0192':

                    output.append('\u0066');

                    break;

                case '\u0193':

                    output.append('\u0067');

                    break;

                case '\u0197':

                    output.append('\u0069');

                    break;

                case '\u0198':

                    output.append('\u006B');

                    break;

                case '\u0199':

                    output.append('\u006B');

                    break;

                case '\u019A':

                    output.append('\u006C');

                    break;

                case '\u019D':

                    output.append('\u006E');

                    break;

                case '\u019E':

                    output.append('\u006E');

                    break;

                case '\u019F':

                    output.append('\u006F');

                    break;

                case '\u01A0':

                    output.append('\u006F');

                    break;

                case '\u01A1':

                    output.append('\u006F');

                    break;

                case '\u01A4':

                    output.append('\u0070');

                    break;

                case '\u01A5':

                    output.append('\u0070');

                    break;

                case '\u01AB':

                    output.append('\u0074');

                    break;

                case '\u01AC':

                    output.append('\u0074');

                    break;

                case '\u01AD':

                    output.append('\u0074');

                    break;

                case '\u01AE':

                    output.append('\u0074');

                    break;

                case '\u01AF':

                    output.append('\u0075');

                    break;

                case '\u01B0':

                    output.append('\u0075');

                    break;

                case '\u01B3':

                    output.append('\u0079');

                    break;

                case '\u01B4':

                    output.append('\u0079');

                    break;

                case '\u01B5':

                    output.append('\u007A');

                    break;

                case '\u01B6':

                    output.append('\u007A');

                    break;

                case '\u01CD':

                    output.append('\u0061');

                    break;

                case '\u01CE':

                    output.append('\u0061');

                    break;

                case '\u01CF':

                    output.append('\u0069');

                    break;

                case '\u01D0':

                    output.append('\u0069');

                    break;

                case '\u01D1':

                    output.append('\u006F');

                    break;

                case '\u01D2':

                    output.append('\u006F');

                    break;

                case '\u01D3':

                    output.append('\u0075');

                    break;

                case '\u01D4':

                    output.append('\u0075');

                    break;

                case '\u01D5':

                    output.append('\u0075');

                    break;

                case '\u01D6':

                    output.append('\u0075');

                    break;

                case '\u01D7':

                    output.append('\u0075');

                    break;

                case '\u01D8':

                    output.append('\u0075');

                    break;

                case '\u01D9':

                    output.append('\u0075');

                    break;

                case '\u01DA':

                    output.append('\u0075');

                    break;

                case '\u01DB':

                    output.append('\u0075');

                    break;

                case '\u01DC':

                    output.append('\u0075');

                    break;

                case '\u01DE':

                    output.append('\u0061');

                    break;

                case '\u01DF':

                    output.append('\u0061');

                    break;

                case '\u01E0':

                    output.append('\u0061');

                    break;

                case '\u01E1':

                    output.append('\u0061');

                    break;

                case '\u01E4':

                    output.append('\u0067');

                    break;

                case '\u01E5':

                    output.append('\u0067');

                    break;

                case '\u01E6':

                    output.append('\u0067');

                    break;

                case '\u01E7':

                    output.append('\u0067');

                    break;

                case '\u01E8':

                    output.append('\u006B');

                    break;

                case '\u01E9':

                    output.append('\u006B');

                    break;

                case '\u01EA':

                    output.append('\u006F');

                    break;

                case '\u01EB':

                    output.append('\u006F');

                    break;

                case '\u01EC':

                    output.append('\u006F');

                    break;

                case '\u01ED':

                    output.append('\u006F');

                    break;

                case '\u01F0':

                    output.append('\u006A');

                    break;

                case '\u01F4':

                    output.append('\u0067');

                    break;

                case '\u01F5':

                    output.append('\u0067');

                    break;

                case '\u01F8':

                    output.append('\u006E');

                    break;

                case '\u01F9':

                    output.append('\u006E');

                    break;

                case '\u01FA':

                    output.append('\u0061');

                    break;

                case '\u01FB':

                    output.append('\u0061');

                    break;

                case '\u01FE':

                    output.append('\u006F');

                    break;

                case '\u01FF':

                    output.append('\u006F');

                    break;

                case '\u0200':

                    output.append('\u0061');

                    break;

                case '\u0201':

                    output.append('\u0061');

                    break;

                case '\u0202':

                    output.append('\u0061');

                    break;

                case '\u0203':

                    output.append('\u0061');

                    break;

                case '\u0204':

                    output.append('\u0065');

                    break;

                case '\u0205':

                    output.append('\u0065');

                    break;

                case '\u0206':

                    output.append('\u0065');

                    break;

                case '\u0207':

                    output.append('\u0065');

                    break;

                case '\u0208':

                    output.append('\u0069');

                    break;

                case '\u0209':

                    output.append('\u0069');

                    break;

                case '\u020A':

                    output.append('\u0069');

                    break;

                case '\u020B':

                    output.append('\u0069');

                    break;

                case '\u020C':

                    output.append('\u006F');

                    break;

                case '\u020D':

                    output.append('\u006F');

                    break;

                case '\u020E':

                    output.append('\u006F');

                    break;

                case '\u020F':

                    output.append('\u006F');

                    break;

                case '\u0210':

                    output.append('\u0072');

                    break;

                case '\u0211':

                    output.append('\u0072');

                    break;

                case '\u0212':

                    output.append('\u0072');

                    break;

                case '\u0213':

                    output.append('\u0072');

                    break;

                case '\u0214':

                    output.append('\u0075');

                    break;

                case '\u0215':

                    output.append('\u0075');

                    break;

                case '\u0216':

                    output.append('\u0075');

                    break;

                case '\u0217':

                    output.append('\u0075');

                    break;

                case '\u0218':

                    output.append('\u0073');

                    break;

                case '\u0219':

                    output.append('\u0073');

                    break;

                case '\u021A':

                    output.append('\u0074');

                    break;

                case '\u021B':

                    output.append('\u0074');

                    break;

                case '\u021E':

                    output.append('\u0068');

                    break;

                case '\u021F':

                    output.append('\u0068');

                    break;

                case '\u0220':

                    output.append('\u006E');

                    break;

                case '\u0221':

                    output.append('\u0064');

                    break;

                case '\u0224':

                    output.append('\u007A');

                    break;

                case '\u0225':

                    output.append('\u007A');

                    break;

                case '\u0226':

                    output.append('\u0061');

                    break;

                case '\u0227':

                    output.append('\u0061');

                    break;

                case '\u0228':

                    output.append('\u0065');

                    break;

                case '\u0229':

                    output.append('\u0065');

                    break;

                case '\u022A':

                    output.append('\u006F');

                    break;

                case '\u022B':

                    output.append('\u006F');

                    break;

                case '\u022C':

                    output.append('\u006F');

                    break;

                case '\u022D':

                    output.append('\u006F');

                    break;

                case '\u022E':

                    output.append('\u006F');

                    break;

                case '\u022F':

                    output.append('\u006F');

                    break;

                case '\u0230':

                    output.append('\u006F');

                    break;

                case '\u0231':

                    output.append('\u006F');

                    break;

                case '\u0232':

                    output.append('\u0079');

                    break;

                case '\u0233':

                    output.append('\u0079');

                    break;

                case '\u0234':

                    output.append('\u006C');

                    break;

                case '\u0235':

                    output.append('\u006E');

                    break;

                case '\u0236':

                    output.append('\u0074');

                    break;

                case '\u023A':

                    output.append('\u0061');

                    break;

                case '\u023B':

                    output.append('\u0063');

                    break;

                case '\u023C':

                    output.append('\u0063');

                    break;

                case '\u023D':

                    output.append('\u006C');

                    break;

                case '\u023E':

                    output.append('\u0074');

                    break;

                case '\u023F':

                    output.append('\u0073');

                    break;

                case '\u0240':

                    output.append('\u007A');

                    break;

                case '\u1E00':

                    output.append('\u0061');

                    break;

                case '\u1E01':

                    output.append('\u0061');

                    break;

                case '\u1E02':

                    output.append('\u0062');

                    break;

                case '\u0E03':

                    output.append('\u0062');

                    break;

                case '\u0E04':

                    output.append('\u0062');

                    break;

                case '\u1E05':

                    output.append('\u0062');

                    break;

                case '\u1E06':

                    output.append('\u0062');

                    break;

                case '\u1E07':

                    output.append('\u0062');

                    break;

                case '\u1E08':

                    output.append('\u0063');

                    break;

                case '\u1E09':

                    output.append('\u0063');

                    break;

                case '\u1E0A':

                    output.append('\u0064');

                    break;

                case '\u1E0B':

                    output.append('\u0064');

                    break;

                case '\u1E0C':

                    output.append('\u0064');

                    break;

                case '\u1E0D':

                    output.append('\u0064');

                    break;

                case '\u1E0E':

                    output.append('\u0064');

                    break;

                case '\u1E0F':

                    output.append('\u0064');

                    break;

                case '\u1E10':

                    output.append('\u0064');

                    break;

                case '\u1E11':

                    output.append('\u0064');

                    break;

                case '\u1E12':

                    output.append('\u0064');

                    break;

                case '\u1E13':

                    output.append('\u0064');

                    break;

                case '\u1E14':

                    output.append('\u0065');

                    break;

                case '\u1E15':

                    output.append('\u0065');

                    break;

                case '\u1E16':

                    output.append('\u0065');

                    break;

                case '\u1E17':

                    output.append('\u0065');

                    break;

                case '\u1E18':

                    output.append('\u0065');

                    break;

                case '\u1E19':

                    output.append('\u0065');

                    break;

                case '\u1E1A':

                    output.append('\u0065');

                    break;

                case '\u1E1B':

                    output.append('\u0065');

                    break;

                case '\u1E1C':

                    output.append('\u0065');

                    break;

                case '\u1E1D':

                    output.append('\u0065');

                    break;

                case '\u1E1E':

                    output.append('\u0066');

                    break;

                case '\u1E1F':

                    output.append('\u0066');

                    break;

                case '\u1E20':

                    output.append('\u0067');

                    break;

                case '\u1E21':

                    output.append('\u0067');

                    break;

                case '\u1E22':

                    output.append('\u0068');

                    break;

                case '\u1E23':

                    output.append('\u0068');

                    break;

                case '\u1E24':

                    output.append('\u0068');

                    break;

                case '\u1E25':

                    output.append('\u0068');

                    break;

                case '\u1E26':

                    output.append('\u0068');

                    break;

                case '\u1E27':

                    output.append('\u0068');

                    break;

                case '\u1E28':

                    output.append('\u0068');

                    break;

                case '\u1E29':

                    output.append('\u0068');

                    break;

                case '\u1E2A':

                    output.append('\u0068');

                    break;

                case '\u1E2B':

                    output.append('\u0068');

                    break;

                case '\u1E2C':

                    output.append('\u0069');

                    break;

                case '\u1E2D':

                    output.append('\u0069');

                    break;

                case '\u1E2E':

                    output.append('\u0069');

                    break;

                case '\u1E2F':

                    output.append('\u0069');

                    break;

                case '\u1E30':

                    output.append('\u006B');

                    break;

                case '\u1E31':

                    output.append('\u006B');

                    break;

                case '\u1E32':

                    output.append('\u006B');

                    break;

                case '\u1E33':

                    output.append('\u006B');

                    break;

                case '\u1E34':

                    output.append('\u006B');

                    break;

                case '\u1E35':

                    output.append('\u006B');

                    break;

                case '\u1E36':

                    output.append('\u006C');

                    break;

                case '\u1E37':

                    output.append('\u006C');

                    break;

                case '\u1E38':

                    output.append('\u006C');

                    break;

                case '\u1E39':

                    output.append('\u006C');

                    break;

                case '\u1E3A':

                    output.append('\u006C');

                    break;

                case '\u1E3B':

                    output.append('\u006C');

                    break;

                case '\u1E3C':

                    output.append('\u006C');

                    break;

                case '\u1E3D':

                    output.append('\u006C');

                    break;

                case '\u1E3E':

                    output.append('\u006D');

                    break;

                case '\u1E3F':

                    output.append('\u006D');

                    break;

                case '\u1E40':

                    output.append('\u006D');

                    break;

                case '\u1E41':

                    output.append('\u006D');

                    break;

                case '\u1E42':

                    output.append('\u006D');

                    break;

                case '\u1E43':

                    output.append('\u006D');

                    break;

                case '\u1E44':

                    output.append('\u006E');

                    break;

                case '\u1E45':

                    output.append('\u006E');

                    break;

                case '\u1E46':

                    output.append('\u006E');

                    break;

                case '\u1E47':

                    output.append('\u006E');

                    break;

                case '\u1E48':

                    output.append('\u006E');

                    break;

                case '\u1E49':

                    output.append('\u006E');

                    break;

                case '\u1E4A':

                    output.append('\u006E');

                    break;

                case '\u1E4B':

                    output.append('\u006E');

                    break;

                case '\u1E4C':

                    output.append('\u006F');

                    break;

                case '\u1E4D':

                    output.append('\u006F');

                    break;

                case '\u1E4E':

                    output.append('\u006F');

                    break;

                case '\u1E4F':

                    output.append('\u006F');

                    break;

                case '\u1E50':

                    output.append('\u006F');

                    break;

                case '\u1E51':

                    output.append('\u006F');

                    break;

                case '\u1E52':

                    output.append('\u006F');

                    break;

                case '\u1E53':

                    output.append('\u006F');

                    break;

                case '\u1E54':

                    output.append('\u0070');

                    break;

                case '\u1E55':

                    output.append('\u0070');

                    break;

                case '\u1E56':

                    output.append('\u0070');

                    break;

                case '\u1E57':

                    output.append('\u0070');

                    break;

                case '\u1E58':

                    output.append('\u0072');

                    break;

                case '\u1E59':

                    output.append('\u0072');

                    break;

                case '\u1E5A':

                    output.append('\u0072');

                    break;

                case '\u1E5B':

                    output.append('\u0072');

                    break;

                case '\u1E5C':

                    output.append('\u0072');

                    break;

                case '\u1E5D':

                    output.append('\u0072');

                    break;

                case '\u1E5E':

                    output.append('\u0072');

                    break;

                case '\u1E5F':

                    output.append('\u0072');

                    break;

                case '\u1E60':

                    output.append('\u0073');

                    break;

                case '\u1E61':

                    output.append('\u0073');

                    break;

                case '\u1E62':

                    output.append('\u0073');

                    break;

                case '\u1E63':

                    output.append('\u0073');

                    break;

                case '\u1E64':

                    output.append('\u0073');

                    break;

                case '\u1E65':

                    output.append('\u0073');

                    break;

                case '\u1E66':

                    output.append('\u0073');

                    break;

                case '\u1E67':

                    output.append('\u0073');

                    break;

                case '\u1E68':

                    output.append('\u0073');

                    break;

                case '\u1E69':

                    output.append('\u0073');

                    break;

                case '\u1E6A':

                    output.append('\u0074');

                    break;

                case '\u1E6B':

                    output.append('\u0074');

                    break;

                case '\u1E6C':

                    output.append('\u0074');

                    break;

                case '\u1E6D':

                    output.append('\u0074');

                    break;

                case '\u1E6E':

                    output.append('\u0074');

                    break;

                case '\u1E6F':

                    output.append('\u0074');

                    break;

                case '\u1E70':

                    output.append('\u0074');

                    break;

                case '\u1E71':

                    output.append('\u0074');

                    break;

                case '\u1E72':

                    output.append('\u0075');

                    break;

                case '\u1E73':

                    output.append('\u0075');

                    break;

                case '\u1E74':

                    output.append('\u0075');

                    break;

                case '\u1E75':

                    output.append('\u0075');

                    break;

                case '\u1E76':

                    output.append('\u0075');

                    break;

                case '\u1E77':

                    output.append('\u0075');

                    break;

                case '\u1E78':

                    output.append('\u0075');

                    break;

                case '\u1E79':

                    output.append('\u0075');

                    break;

                case '\u1E7A':

                    output.append('\u0075');

                    break;

                case '\u1E7B':

                    output.append('\u0075');

                    break;

                case '\u1E7C':

                    output.append('\u0076');

                    break;

                case '\u1E7D':

                    output.append('\u0076');

                    break;

                case '\u1E7E':

                    output.append('\u0076');

                    break;

                case '\u1E7F':

                    output.append('\u0076');

                    break;

                case '\u1E80':

                    output.append('\u0077');

                    break;

                case '\u1E81':

                    output.append('\u0077');

                    break;

                case '\u1E82':

                    output.append('\u0077');

                    break;

                case '\u1E83':

                    output.append('\u0077');

                    break;

                case '\u1E84':

                    output.append('\u0077');

                    break;

                case '\u1E85':

                    output.append('\u0077');

                    break;

                case '\u1E86':

                    output.append('\u0077');

                    break;

                case '\u1E87':

                    output.append('\u0077');

                    break;

                case '\u1E88':

                    output.append('\u0077');

                    break;

                case '\u1E89':

                    output.append('\u0077');

                    break;

                case '\u1E8A':

                    output.append('\u0078');

                    break;

                case '\u1E8B':

                    output.append('\u0078');

                    break;

                case '\u1E8C':

                    output.append('\u0078');

                    break;

                case '\u1E8D':

                    output.append('\u0078');

                    break;

                case '\u1E8E':

                    output.append('\u0079');

                    break;

                case '\u1E8F':

                    output.append('\u0079');

                    break;

                case '\u1E90':

                    output.append('\u007A');

                    break;

                case '\u1E91':

                    output.append('\u007A');

                    break;

                case '\u1E92':

                    output.append('\u007A');

                    break;

                case '\u1E93':

                    output.append('\u007A');

                    break;

                case '\u1E94':

                    output.append('\u007A');

                    break;

                case '\u1E95':

                    output.append('\u007A');

                    break;

                case '\u1E96':

                    output.append('\u0068');

                    break;

                case '\u1E97':

                    output.append('\u0074');

                    break;

                case '\u1E98':

                    output.append('\u0077');

                    break;

                case '\u1E99':

                    output.append('\u0079');

                    break;

                case '\u1E9A':

                    output.append('\u0061');

                    break;

                case '\u1E9B':

                    output.append('\u0066');

                    break;

                case '\u1EA0':

                    output.append('\u0061');

                    break;

                case '\u1EA1':

                    output.append('\u0061');

                    break;

                case '\u1EA2':

                    output.append('\u0061');

                    break;

                case '\u1EA3':

                    output.append('\u0061');

                    break;

                case '\u1EA4':

                    output.append('\u0061');

                    break;

                case '\u1EA5':

                    output.append('\u0061');

                    break;

                case '\u1EA6':

                    output.append('\u0061');

                    break;

                case '\u1EA7':

                    output.append('\u0061');

                    break;

                case '\u1EA8':

                    output.append('\u0061');

                    break;

                case '\u1EA9':

                    output.append('\u0061');

                    break;

                case '\u1EAA':

                    output.append('\u0061');

                    break;

                case '\u1EAB':

                    output.append('\u0061');

                    break;

                case '\u1EAC':

                    output.append('\u0061');

                    break;

                case '\u1EAD':

                    output.append('\u0061');

                    break;

                case '\u1EAE':

                    output.append('\u0061');

                    break;

                case '\u1EAF':

                    output.append('\u0061');

                    break;

                case '\u1EB0':

                    output.append('\u0061');

                    break;

                case '\u1EB1':

                    output.append('\u0061');

                    break;

                case '\u1EB2':

                    output.append('\u0061');

                    break;

                case '\u1EB3':

                    output.append('\u0061');

                    break;

                case '\u1EB4':

                    output.append('\u0061');

                    break;

                case '\u1EB5':

                    output.append('\u0061');

                    break;

                case '\u1EB6':

                    output.append('\u0061');

                    break;

                case '\u1EB7':

                    output.append('\u0061');

                    break;

                case '\u1EB8':

                    output.append('\u0065');

                    break;

                case '\u1EB9':

                    output.append('\u0065');

                    break;

                case '\u1EBA':

                    output.append('\u0065');

                    break;

                case '\u1EBB':

                    output.append('\u0065');

                    break;

                case '\u1EBC':

                    output.append('\u0065');

                    break;

                case '\u1EBD':

                    output.append('\u0065');

                    break;

                case '\u1EBE':

                    output.append('\u0065');

                    break;

                case '\u1EBF':

                    output.append('\u0065');

                    break;

                case '\u1EC0':

                    output.append('\u0065');

                    break;

                case '\u1EC1':

                    output.append('\u0065');

                    break;

                case '\u1EC2':

                    output.append('\u0065');

                    break;

                case '\u1EC3':

                    output.append('\u0065');

                    break;

                case '\u1EC4':

                    output.append('\u0065');

                    break;

                case '\u1EC5':

                    output.append('\u0065');

                    break;

                case '\u1EC6':

                    output.append('\u0065');

                    break;

                case '\u1EC7':

                    output.append('\u0065');

                    break;

                case '\u1EC8':

                    output.append('\u0069');

                    break;

                case '\u1EC9':

                    output.append('\u0069');

                    break;

                case '\u1ECA':

                    output.append('\u0069');

                    break;

                case '\u1ECB':

                    output.append('\u0069');

                    break;

                case '\u1ECC':

                    output.append('\u006F');

                    break;

                case '\u1ECD':

                    output.append('\u006F');

                    break;

                case '\u1ECE':

                    output.append('\u006F');

                    break;

                case '\u1ECF':

                    output.append('\u006F');

                    break;

                case '\u1ED0':

                    output.append('\u006F');

                    break;

                case '\u1ED1':

                    output.append('\u006F');

                    break;

                case '\u1ED2':

                    output.append('\u006F');

                    break;

                case '\u1ED3':

                    output.append('\u006F');

                    break;

                case '\u1ED4':

                    output.append('\u006F');

                    break;

                case '\u1ED5':

                    output.append('\u006F');

                    break;

                case '\u1ED6':

                    output.append('\u006F');

                    break;

                case '\u1ED7':

                    output.append('\u006F');

                    break;

                case '\u1ED8':

                    output.append('\u006F');

                    break;

                case '\u1ED9':

                    output.append('\u006F');

                    break;

                case '\u1EDA':

                    output.append('\u006F');

                    break;

                case '\u1EDB':

                    output.append('\u006F');

                    break;

                case '\u1EDC':

                    output.append('\u006F');

                    break;

                case '\u1EDD':

                    output.append('\u006F');

                    break;

                case '\u1EDE':

                    output.append('\u006F');

                    break;

                case '\u1EDF':

                    output.append('\u006F');

                    break;

                case '\u1EE0':

                    output.append('\u006F');

                    break;

                case '\u1EE1':

                    output.append('\u006F');

                    break;

                case '\u1EE2':

                    output.append('\u006F');

                    break;

                case '\u1EE3':

                    output.append('\u006F');

                    break;

                case '\u1EE4':

                    output.append('\u0075');

                    break;

                case '\u1EE5':

                    output.append('\u0075');

                    break;

                case '\u1EE6':

                    output.append('\u0075');

                    break;

                case '\u1EE7':

                    output.append('\u0075');

                    break;

                case '\u1EE8':

                    output.append('\u0075');

                    break;

                case '\u1EE9':

                    output.append('\u0075');

                    break;

                case '\u1EEA':

                    output.append('\u0075');

                    break;

                case '\u1EEB':

                    output.append('\u0075');

                    break;

                case '\u1EEC':

                    output.append('\u0075');

                    break;

                case '\u1EED':

                    output.append('\u0075');

                    break;

                case '\u1EEE':

                    output.append('\u0075');

                    break;

                case '\u1EEF':

                    output.append('\u0075');

                    break;

                case '\u1EF0':

                    output.append('\u0075');

                    break;

                case '\u1EF1':

                    output.append('\u0075');

                    break;

                case '\u1EF2':

                    output.append('\u0079');

                    break;

                case '\u1EF3':

                    output.append('\u0079');

                    break;

                case '\u1EF4':

                    output.append('\u0079');

                    break;

                case '\u1EF5':

                    output.append('\u0079');

                    break;

                case '\u1EF6':

                    output.append('\u0079');

                    break;

                case '\u1EF7':

                    output.append('\u0079');

                    break;

                case '\u1EF8':

                    output.append('\u0079');

                    break;

                case '\u1EF9':

                    output.append('\u0079');
                    break;

                default:
                    output.append(input.charAt(i));
                    break;
            }
        }
        return output.toString();
    }

}
